package main

type Student struct {
	ID     int    `json:"id"`
	Gender string `json:"gender"`
	Name   string `json:"name"`
	weight string
}

type Class struct {
	Name    string    `json:"name"`
	Student []Student `json:"student"`
}

func main() {
	// 结构体和JSON数据相互转换

	// // 结构体转JSON
	// // 通过 encoding/json 包中的 json.Marshal()
	// // func json.Marshal(v interface{}) ([]byte, error)
	// var s1 = Student{
	// 	ID:     12,
	// 	Gender: "男",
	// 	Name:   "李四",
	// }
	// jsonByte, _ := json.Marshal(s1) // 第二个返回值为error，没有error则返回nil
	// jsonStr := string(jsonByte)
	// fmt.Printf("%v", jsonStr)

	// // JSON转结构体
	// // json.Unmarshal(data []byte, v interface{}) error
	// var str = `{"ID": 12, "Gender": "男", "Name": "李四"}`
	// var s1 Student
	// err := json.Unmarshal([]byte(str), &s1)
	// if err != nil {
	// 	fmt.Println(err)
	// }
	// fmt.Printf("%#v\n", s1)
	// fmt.Println(s1.name) // 私有属性不会被json包访问

	// // 结构体标签Tag--自定义结构体变化为JSON后字段名的表现 (ID     int    `json:"id"`)
	// var s2 = Student{
	// 	ID:     12,
	// 	Gender: "男",
	// 	name:   "Mike",
	// }
	// jsonByte, _ := json.Marshal(s2)
	// jsonStr := string(jsonByte)
	// fmt.Println(jsonStr)

	// // 嵌套结构体和JSON之间的转换
	// c := Class{
	// 	Name:    "初一三班",
	// 	Student: make([]Student, 0),
	// }
	// gender := ""
	// for i := 1; i <= 5; i++ {

	// 	if i%2 == 0 {
	// 		gender = "男"
	// 	} else {
	// 		gender = "女"
	// 	}
	// 	tems := Student{
	// 		ID:     i,
	// 		Gender: gender,
	// 		Name:   fmt.Sprintf("stud_%v", i),
	// 		weight: string(100 + i*10),
	// 	}
	// 	c.Student = append(c.Student, tems)
	// }
	// classByte, err := json.Marshal(c)
	// var classJson string
	// if err != nil {
	// 	fmt.Println(err)
	// 	classJson = ""
	// } else {
	// 	classJson = string(classByte)
	// 	fmt.Println(classJson)
	// }

	// // JSON转嵌套结构体
	// var c2 = Class{}
	// err2 := json.Unmarshal([]byte(classJson), &c2)
	// if err2 != nil {
	// 	fmt.Println(err2)
	// } else {
	// 	fmt.Printf("%#v\n", c2)
	// 	fmt.Println(c2.Name)
	// }
}
